package com.linksfield.topup.mapper;

import com.linksfield.topup.config.dto.CalculateResultParamVo;
import com.linksfield.topup.config.dto.PageAndSort;
import com.linksfield.topup.entity.common.*;
import com.linksfield.topup.entity.interfaces.planmanage.search.request.RequestServicePlanSearch;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 套餐管理业务逻辑数据库操作映射接口
 *
 * @author: lm
 * @date: 2019-11-21 15:40
 */

@Mapper
public interface ServicePlanMapper {
    /**
     * 专门用于新建套餐这边的企业列表：
     * <p>
     * 这边的列表要求是都有已启用的方案，符合新建套餐的要求
     * <p>
     * 这个接口可以屏蔽掉没有方案的企业出现在列表里面
     *
     * @param partnerCode
     * @return
     */
    List<PartnerConfigContent> partnerList(@Param("partnerCode") String partnerCode);

    /***
     * 根据partnerCode获取企业名称列表
     * @param partnerCode
     * @return
     */
    List<PartnerInfo> partnerNameList(@Param("partnerCode") String partnerCode);

    /***
     * 根据partnerCode获取套餐名称列表
     * @param partnerCode
     * @return
     */
    List<PartnerPackage> packageNameList(@Param("partnerCode") String partnerCode);

    /**
     * 根据partnerCode和packageCode获取套餐基本详细信息
     *
     * @param partnerCode
     * @param packageCode
     * @return
     */
    List<PartnerPackage> packageListByCode(@Param("partnerCode") String partnerCode,
                                           @Param("packageCode") String packageCode);

    /***
     * 新建套餐页面：确认新建或者上架之后保存套餐的操作
     * @param plan
     * @return
     */
    Integer createServicePlan(PartnerServicePlan plan);

    /***
     *新建套餐页面：确认新建或者上架时：设置规格与价格
     * @param specPrice
     * @return
     */
    Integer createServicePlanSpecPrice(PartnerServicePlanSpecPrice specPrice);

    /***
     * 分页数据：搜索之前先去数据库算出分页的具体数据
     * @param request
     * @return
     */
    long searchPageCount(@Param("request") RequestServicePlanSearch request);

    /***
     * 分页搜索
     * @param request
     * @param pageHelper
     * @return
     */
    List<PartnerServicePlan> search(@Param("request") RequestServicePlanSearch request,
                                    @Param("pageHelper") PageAndSort pageHelper);

    /***
     * 计算套餐服务计划不同状态对应的条数
     * @param request
     * @return
     */
    List<CalculateResultParamVo> calculate(@Param("request") RequestServicePlanSearch request);

    /***
     * 套餐服务计划：编辑（详情）
     * @param partnerCode
     * @param servicePlanCode
     * @return
     */
    List<PartnerServicePlan> editInfo(@Param("partnerCode") String partnerCode,
                                      @Param("servicePlanCode") String servicePlanCode);

    /**
     * 在编辑页面：所做的操作：确认新建或者上架
     *
     * @param plan
     * @return
     */
    Integer updateServicePlan(PartnerServicePlan plan);

    /***
     * 套餐服务计划：编辑（详情）检索某个套餐具体的规格与价格
     * @param partnerCode
     * @param servicePlanCode
     * @return
     */
    List<PartnerServicePlanSpecPrice> specPriceInfo(@Param("partnerCode") String partnerCode,
                                                    @Param("servicePlanCode") String servicePlanCode);

    /***
     *套餐服务计划：操作状态：全部上架，全部下架，上架，下架
     * @param plan
     */
    void operateServicePlanStatus(PartnerServicePlan plan);

    /***
     * 根据上报的信息去数据库查询套餐服务计划的状态
     * @param partnerCode
     * @param servicePlanCode
     * @return
     */
    String queryServicePlanStatus(@Param("partnerCode") String partnerCode,
                                  @Param("servicePlanCode") String servicePlanCode);

    /**
     * 根据企业查询对应的语言配置方案类型
     *
     * @param partnerCode
     * @param planCode
     * @return
     */
    List<PartnerConfigLang> queryLangType(@Param("partnerCode") String partnerCode,
                                          @Param("planCode") String planCode);

    /***
     *根据语言类型编码去查询到对应的语言名称
     * @param languageCode
     * @return
     */
    String queryLangName(@Param("languageCode") String languageCode);

    /***
     *去数据库空清空这几条价格和规格数据
     * @param partnerCode
     * @param packageCode
     * @param servicePlanCode
     * @return
     */
    Integer deleteSpecPrice(@Param("partnerCode") String partnerCode,
                            @Param("packageCode") String packageCode,
                            @Param("servicePlanCode") String servicePlanCode);

    /**
     * 根据企业编码查询正在启用的配置方案编码
     *
     * @param partnerCode
     * @return
     */
    String queryConfigTypeByCode(@Param("partnerCode") String partnerCode);

    /**
     * 根据企业编码查询正在启用的配置方案编码
     *
     * @param partnerCode
     * @return
     */
    String queryPlanCodeByCode(@Param("partnerCode") String partnerCode);

    /**
     * 根据企业和套餐查询最小的售卖规格
     *
     * @param partnerCode
     * @param packageCode
     * @param servicePlanCode
     * @return
     */
    String queryMinSpecifications(@Param("partnerCode") String partnerCode,
                                  @Param("packageCode") String packageCode,
                                  @Param("servicePlanCode") String servicePlanCode);

    /**
     * 查询某个企业下面某个套餐上架名称是否重复
     *
     * @param partnerCode
     * @param servicePlanShowName
     * @return
     */
    Integer queryShowName(@Param("partnerCode") String partnerCode,
                          @Param("servicePlanShowName") String servicePlanShowName);
}
